package com.shujia.jichu

import scala.io.Source

/**
 * 模式匹配
 * javaswitch选择匹配：匹配基本数据类型，字符串，枚举
 *
 * scala中的模式匹配，可以匹配基本数据类型，字符串，对象，元组，数组
 *
 */
object Demo23Match {
  def main(args: Array[String]): Unit = {


    /**
     * 模式匹配匹配基本数据类型
     * 注：
     * 1、case只会匹配其中一个
     * 2、如果没有对应的case匹配，会进行报错
     * 3、模式匹配中的case是自上而下匹配的，哪一个case放在上面就会先进行匹配
     */
    val i: Int = 100
    i match {
      case _ => println("i是其他值")
      case 10 => println("i的值是10")
      case 100 => println("i的值是100")
    }

    /**
     * 模式匹配匹配字符串数据类型
     */
    val str: String = "java2"
    str match {
      case "hadoop" => println("hadoop")
      case "java" => println("java")
      case _ => println("其他")
    }

    /**
     * 模式匹配匹配元组
     * 元组模式匹配的时候，匹配的是元组中的元素类型
     */
    val t: (String, Int, String) = ("张三", 18, "安徽合肥")
    t match {
      case (name: String, age: Int, address: String) => println(s"姓名:${name},年龄:${age},地址:${address}")
    }

    /**
     * 模式匹配匹配数组
     * 数组模式匹配的时候，匹配的是元组中的元素类型,但可以进行多个case匹配，而元组不行
     */
    val array1: Array[String] = Array("1001", "李四")
    array1 match {
      case Array(id: String, name: String) => println(s"学号:${id},姓名:${name}")
      case Array(id: String, name: String,address:String) => println(s"学号:${id},姓名:${name}")
    }

    /**
     * 模式匹配匹配值的类型
     */
    val obj:Any = true
    obj match {
      case a:Int => println("obj是一个int类型的值")
      case b:String => println("obj是一个String类型的值")
      case _ => println("obj是一个其他类型的值")
    }

    println("="*100)
    /**
     * scala中模式匹配可以有返回值
     *
     * Option: Some None
     *
     */
    val map: Map[String, String] = Map("1001" -> "张三", "1002" -> "李四")
    println(map.getOrElse("1007", "默认值"))
    println(map.get("1007"))
    //如果get键的时候，键不存在，返回None,这是无法调用get函数
    //可以使用模式匹配解决这样的报错问题
    val result: String = map.get("1007") match {
      case Some(v) => v
      case None => "默认值"
    }
    println(result)
    println("="*100)
    /**
     * scala今后在开发中，模式匹配一般结合函数使用
     *
     */
    val studentList: List[String] = Source.fromFile("scala/data/score.txt").getLines().toList
    val stuArrayList: List[Array[String]] = studentList.map((line:String) => line.split(","))
    // ["1500100001","1000001","98"]
    //模式匹配的话使用map函数，需要将小括号换成大括号去做
    val tuples: List[(String, String)] = stuArrayList.map {
      case Array(id: String, _:String, score: String) => (id, score)
    }
    tuples.foreach(println)






  }
}
